import { NextRequest, NextResponse } from 'next/server';
import { Txt2ImgRequest } from '@/types/txt2img';
import { SD_BASE_URL, AI_MODEL_CONFIG } from '@/lib/config';

export async function POST(request: NextRequest) {
  try {
    const { userInput } = await request.json();

    if (!userInput) {
      return NextResponse.json(
        { error: '用户输入不能为空' },
        { status: 400 }
      );
    }

    // 第一步：调用AI模型生成提示词和参数
    const promptGenerationResponse = await fetch(AI_MODEL_CONFIG.apiUrl, {
      method: 'POST',
      headers: {
        'Content-Type': 'application/json',
      },
      body: JSON.stringify({
        model: AI_MODEL_CONFIG.defaultModel,
        messages: [
          {
            role: 'system',
            content: `你是一个SD文生图模型提示词专家。根据用户输入的内容生成正向和反向提示词以及生成参数。

请严格按照以下JSON格式返回，不要包含任何其他文字：

{
  "prompt": "正向提示词，描述用户想要生成的图片内容",
  "negative_prompt": "反向提示词，描述不想要的内容",
  "width": 512,
  "height": 512,
  "steps": 50,
  "cfg_scale": 7,
  "sampler_name": "Euler",
  "batch_size": 1,
  "n_iter": 1
}

注意：
1. 正向提示词要详细描述用户想要的图片内容
2. 反向提示词要包含常见的不想要的内容，如低质量、模糊等
3. 参数要合理设置，确保能生成好的图片
4. 只返回JSON格式，不要有其他说明文字`
          },
          {
            role: 'user',
            content: userInput
          }
        ],
        max_tokens: AI_MODEL_CONFIG.maxTokens,
        temperature: AI_MODEL_CONFIG.temperature,
        top_p: AI_MODEL_CONFIG.topP
      })
    });

    if (!promptGenerationResponse.ok) {
      throw new Error('AI模型调用失败');
    }

    const promptData = await promptGenerationResponse.json();
    const aiResponse = promptData.choices[0]?.message?.content;

    if (!aiResponse) {
      throw new Error('AI模型返回内容为空');
    }

    // 解析AI返回的JSON
    let txt2imgParams: Txt2ImgRequest;
    try {
      // 尝试直接解析JSON
      txt2imgParams = JSON.parse(aiResponse);
    } catch (parseError) {
      // 如果直接解析失败，尝试提取JSON部分
      const jsonMatch = aiResponse.match(/\{[\s\S]*\}/);
      if (jsonMatch) {
        txt2imgParams = JSON.parse(jsonMatch[0]);
      } else {
        throw new Error('无法解析AI返回的JSON格式');
      }
    }

    // 验证必要参数
    if (!txt2imgParams.prompt || !txt2imgParams.negative_prompt) {
      throw new Error('AI返回的参数不完整');
    }

    // 设置默认值
    const defaultParams: Txt2ImgRequest = {
      prompt: txt2imgParams.prompt,
      negative_prompt: txt2imgParams.negative_prompt,
      width: txt2imgParams.width || 512,
      height: txt2imgParams.height || 512,
      batch_size: txt2imgParams.batch_size || 1,
      n_iter: txt2imgParams.n_iter || 1,
      steps: txt2imgParams.steps || 50,
      cfg_scale: txt2imgParams.cfg_scale || 7,
      sampler_name: txt2imgParams.sampler_name || 'Euler'
    };

    // 第二步：调用txt2img接口生成图片
    const imageGenerationResponse = await fetch(`${SD_BASE_URL}/sdapi/v1/txt2img`, {
      method: 'POST',
      headers: {
        'Content-Type': 'application/json',
      },
      body: JSON.stringify(defaultParams)
    });

    if (!imageGenerationResponse.ok) {
      const errorDetail = await imageGenerationResponse.text();
      throw new Error(`图片生成失败: ${errorDetail}`);
    }

    const imageData = await imageGenerationResponse.json();

    // 返回生成的图片数据
    return NextResponse.json({
      success: true,
      images: imageData.images,
      parameters: imageData.parameters,
      info: imageData.info,
      generatedPrompt: txt2imgParams.prompt,
      generatedNegativePrompt: txt2imgParams.negative_prompt
    });

  } catch (error: any) {
    console.error('图片生成错误:', error);
    return NextResponse.json(
      { 
        error: '图片生成失败', 
        detail: error.message || '未知错误'
      },
      { status: 500 }
    );
  }
}
